<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">
        pre {
            font-family: monospace;
            display: block;
            white-space: pre;
            font-size: 2em;
        }
    </style>
</head>
<body>
    <script type="text/javascript" src="../lib/olm/olm.js"></script>
    <script type="module">

        async function main() {
            const Olm = window.Olm;
            await Olm.init({
                locateFile: () => "../lib/olm/olm.wasm",
            });
            const alice = new Olm.Account();
            alice.create();
            console.log("alice", alice.identity_keys());

            const bob = new Olm.Account();
            bob.unpickle("secret", "EWfA87or4GgQ+wqVkyuFiW9gUk3FI6QSXgp8E2dS5RFLvXgy4oFvxwQ1gVnbMkdJz2Hy9ex9UmJ/ZyuRU0aRt0IwXpw/SUNq4IQeVJ7J/miXW7rV4Ep+4RSEf945KbDrokDCS2CoL5PIfv/NYyey32gA0hMi8wWIfIlOxFBV4SBJYSC+Qd54VjprwCg0Sn9vjQouKVrM/+5jzsv9+JK5OpWW0Vrb3qrXwyAOEAQ4WlOQcqZHAyPQIw");
            console.log("bob", bob.identity_keys());
            // generate OTK on receiver side
            bob.generate_one_time_keys(1);
            const bobOneTimeKeys = JSON.parse(bob.one_time_keys());
            const bobOneTimeKey = Object.values(bobOneTimeKeys.curve25519)[0];
            // encrypt
            const aliceSession = new Olm.Session();
            aliceSession.create_outbound(
                alice,
                JSON.parse(bob.identity_keys()).curve25519,
                bobOneTimeKey,
            );
            const message = aliceSession.encrypt("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar pellentesque habitant morbi tristique. Pretium nibh ipsum consequat nisl. Molestie a iaculis at erat pellentesque adipiscing. Semper eget duis at tellus at urna condimentum. Malesuada fames ac turpis egestas maecenas pharetra convallis. Sed lectus vestibulum mattis ullamcorper. Elementum facilisis leo vel fringilla est. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Faucibus nisl tincidunt eget nullam non nisi est. Aliquam faucibus purus in massa tempor. Dui accumsan sit amet nulla facilisi morbi tempus iaculis. Pellentesque dignissim enim sit amet venenatis urna. Nisi porta lorem mollis aliquam ut porttitor leo. Adipiscing elit duis tristique sollicitudin nibh sit. Et netus et malesuada fames ac turpis. Ut diam quam nulla porttitor massa id neque. Pharetra convallis posuere morbi leo urna molestie. A pellentesque sit amet porttitor eget dolor morbi non arcu.");
            console.log("message", message);
            // decrypt
            const bobSession = new Olm.Session();

            let plaintext;
            const iterations = 698;
            let decryptDuration = 0;
            for (let i = 0; i < iterations; i += 1) {
                bobSession.create_inbound(bob, message.body);
                const start = performance.now();
                plaintext = bobSession.decrypt(message.type, message.body);
                const end = performance.now();
                const duration = end - start;
                decryptDuration += duration;
            }
            console.log("plaintext", plaintext);
            console.log(`took avg of ${decryptDuration / iterations}ms to decrypt over ${iterations} iterations`);
            // remove Bob's OTK as it was used to start an olm session
            console.log("bob OTK before removing", bob.one_time_keys());
            bob.remove_one_time_keys(bobSession);
            console.log("bob OTK after removing", bob.one_time_keys());
        }

        main();
    </script>
</body>
</html>
 
